package com.demomaster.quickcompat.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatImageView;

import com.bumptech.glide.Glide;
import com.demomaster.quickcompat.widget.base.QuickViewImpl;
import com.demomaster.quickcompat.widget.base.QuickViewUtil;


/**
 * Created by huan on 2017/11/14.
 */
public class QuickImageView extends AppCompatImageView {
    public QuickImageView(Context context) {
        super(context);
        init(null, 0);
    }

    public QuickImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }

    public QuickImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs, defStyleAttr);
    }
    QuickViewImpl quickViewImpl;

    public void init(AttributeSet attrs, int defStyleAttr) {
        quickViewImpl = new QuickViewImpl(this, attrs, defStyleAttr);
        if (attrs != null) {
            if (quickViewImpl.attribute.backgroundDrawable != null) {
                setBackground(quickViewImpl.attribute.backgroundDrawable);
            }

            if (quickViewImpl.attribute.gifRes != 0) {
                Glide.with(getContext()).load(quickViewImpl.attribute.gifRes).into(this);
            }
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        /*
         * 依据得到的specMode值，
         * 如果是AT_MOST，specSize 代表的是最大可获得的空间；
         * 如果EXACTLY，   specSize 代表的是精确的尺寸；
         * 如果是UNSPECIFIED，对于控件尺寸来说，没有任何参考意义。
         * 当以EXACT方式标记测量尺寸，父元素会坚持在一个指定的精确尺寸区域放置View。在父元素问子元素要多大空间时，
         * AT_MOST指示者会说给我最大的范围。在很多情况下，你得到的值都是相同的。在两种情况下，你必须绝对的处理这些限制。
         * 在一些情况下，它可能会返回超出这些限制的尺寸，在这种情况下，你可以让父元素选择如何对待超出的View，使用裁剪还是滚动等技术。
         */
        if (quickViewImpl.attribute.aspectRatio != 0) {//ch
            //根据提供的测量值提取模式
            int widthMode = View.MeasureSpec.getMode(widthMeasureSpec);
            int heightMode = View.MeasureSpec.getMode(heightMeasureSpec);
            if (widthMode == View.MeasureSpec.EXACTLY) {
                int widthSize = View.MeasureSpec.getSize(widthMeasureSpec);
                heightMeasureSpec = View.MeasureSpec.makeMeasureSpec((int) (widthSize / quickViewImpl.attribute.aspectRatio), widthMode);
                //QDLogger.d("EXACTLY widthMode="+widthMode+",widthSize="+widthSize);
            } else {
                if (heightMode == View.MeasureSpec.EXACTLY) {
                    int heightSize = View.MeasureSpec.getSize(heightMeasureSpec);
                    //QDLogger.d(TAG,"heightSize="+heightSize);
                    widthMeasureSpec = View.MeasureSpec.makeMeasureSpec((int) (heightSize * quickViewImpl.attribute.aspectRatio), heightMode);
                }
            }
        }
        if (quickViewImpl.attribute.isSquare) {
            super.onMeasure(widthMeasureSpec, widthMeasureSpec);
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    @Override
    protected void onDraw(Canvas canvas) {
        QuickViewUtil.draw(canvas,quickViewImpl);
        super.onDraw(canvas);
        QuickViewUtil.drawBadge(this,canvas, quickViewImpl);
    }
    @Override
    public void onDrawForeground(Canvas canvas) {
        QuickViewUtil.draw(canvas,quickViewImpl);
        super.onDrawForeground(canvas);
    }

    @Override
    public void setClickable(boolean clickable) {
        super.setClickable(clickable);
        QuickViewUtil.setClickable(this);
    }

}
